package com.live555.sava264;

import com.live555.callback.IH264ByteInputCallBack;
import com.live555.callback.IH264StoreFinishCallBack;

/**
 * 功能描述:根据接收到的byte[]保存为文件;
 * 因为解包速度 和存储到SD的速度不一样，我们需要做等待提示;
 * 先完成xx.h264的存储 ， 再完成 xx.h264 到xx.mp4的转换。
 * ------------------------------------------------------------------------------------
 * 通过菊花键的等待提示，限制用户只能 在整个过程完成之后才能进行第二次本地录像操作。
 *
 * @author：ZC 创建时间：2017/6/2
 * 最后修改日期：
 */

public class H264FileStorePresenter implements IH264ByteInputCallBack {

    private Thread myStoreFileThread;
    private StoreH264FileRunnable storeH264FileRunnable;
    /**
     * 处理完毕回调
     */
    private IH264StoreFinishCallBack ih264StoreFinishCallBack;

    public H264FileStorePresenter(IH264StoreFinishCallBack ih264StoreFinishCallBack) {
        H264FileSaveCallBackManager.getInstance().setIh264ByteInputCallBack(this);
        this.ih264StoreFinishCallBack = ih264StoreFinishCallBack;
    }


    /**
     * 实现 IH264ByteInputCallBack 接口
     *
     * @param fistCome   是否是第一次传入
     * @param frameBytes 具体的byte[]数据
     * @param msgStr     文件绝对路径
     */
    @Override
    public void onH264FrameDataCome(boolean fistCome, byte[] frameBytes, String msgStr) {
        if (storeH264FileRunnable != null) {
            storeH264FileRunnable.addByteToQueue(frameBytes, msgStr);
        }
    }


    /**
     * 开始存储
     */
    public void startStoreH264() {
        storeH264FileRunnable = new StoreH264FileRunnable();
        storeH264FileRunnable.setIh264StoreFinishCallBack(ih264StoreFinishCallBack);
        storeH264FileRunnable.setStoreH264File(true);
        myStoreFileThread = new Thread(storeH264FileRunnable);
        myStoreFileThread.start();
    }

    /**
     * 停止存储
     */
    public void stopStoreH264() {
        if (storeH264FileRunnable != null) {
            storeH264FileRunnable.setStoreH264File(false);
        } else {
            //情景： 此时并没有启动录像 ，但是从录像模式切换到照片模式。
            //此时会触发结束录像命令 .
            //但是此时并不需要保存H264文件
            ih264StoreFinishCallBack.onStoreAndParseFinished(true, "切换到照片时自动触发结束录像命令");
        }
    }

    /**
     * 结束线程 和 清空队列
     */
    public void stopThreadAndClearQueue() {
        if (storeH264FileRunnable != null) {
            storeH264FileRunnable.stopThreadAndClearQueue();
        }
    }
}
